今天的主題是延續上一篇「[鐵人賽Day23]PHP的開啟檔案-寫入檔案-關閉檔案(超新手計數器示範)」的改良版
上一篇是討論來訪人數,那今天要來討論的就是目前正在線上人數
在這個範例裡面是運用$_SERVER['REMOTE_ADDR']函數,去抓取使用者的IP,並把值跟時間存入MySQL資料庫
好讓系統做比對,不會每一次刷新就加一次人數
同時,設定存活時間,要是超出存活時間,會執行清除的動作,刪除資料庫內舊有的資料
接著,就讓我們來看看今天的程式碼的部分吧
資料庫:ithome_test
資料表:online_user
欄位 類別 Order
online_time int(15)
ip varchar(50) utf8_unicode_ci
SQL:
CREATE TABLE IF NOT EXISTS online\_user
( online\_time
int(15) NOT NULL DEFAULT '0', ip
varchar(50) COLLATE utf8_unicode_ci NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
「online_nums.php」
<?php
$db_localhost = "localhost";
$db_username = "root";
$db_password = "";
$db_name = "ithome_test";
$conn = mysql_connect ($db_localhost, $db_username, $db_password) or die('Could not connect: ' . mysql_error());
mysql_select_db($db_name) or die('Could not select database');
mysql_query("SET NAMES UTF8");
$timeoutseconds = 300; //存活時間,以秒計算
$online_time = time(); //現在時間
$timeout = $online_time-$timeoutseconds; //清除紀錄的時間差標準
$check_select="SELECT `ip` FROM `online_user` WHERE `ip`='".$_SERVER['REMOTE_ADDR']."'";
$result1=mysql_query($check_select);
$check_nums=mysql_num_rows($result1);
if($check_nums < 1){ //驗證回傳是否為空
$insert = "INSERT INTO `online_user`(`online_time`, `ip`) VALUES('$online_time','".$_SERVER['REMOTE_ADDR']."')";
$result2=mysql_query($insert);
if(!($result2)) {
echo "ERROR:語法執行失敗,請檢查是否與資料庫連結或語法是否錯誤";
}
}else{
//不為空則更新在線時間
$update = "UPDATE `online_user` SET `online_time`='$online_time' WHERE `ip`='".$_SERVER['REMOTE_ADDR']."'";
$result2=mysql_query($update);
if(!($result2)) {
echo "ERROR:語法執行失敗,請檢查是否與資料庫連結或語法是否錯誤";
}
}
$delete = "DELETE FROM `online_user` WHERE `online_time` < $timeout"; //清除小於$timeout的值
$result3=mysql_query($delete);
if(!($result3)) {
echo "ERROR:語法執行失敗,請檢查是否與資料庫連結或語法是否錯誤";
}
$select = "SELECT count(`ip`) FROM `online_user`"; //搜尋所有現存ip,統計人數
$result4=mysql_query($select);
if(!($result4)) {
echo "ERROR:語法執行失敗,請檢查是否與資料庫連結或語法是否錯誤";
}
while($row=mysql_fetch_array($result4)){
$user_nums=$row['count(`ip`)'];
}
mysql_close();
echo("目前上線人數:$user_nums 人");
?>